/*
 * TacticaAFAM.java
 *
 * Created on March 9, 2007, 11:04 AM
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package futbol.tacticas.concursantes2007.LosLeonesAFAM;

import futbol.tacticas.Comando;
import futbol.tacticas.ComandoGolpearBola;
import futbol.tacticas.ComandoIrA;
import futbol.tacticas.ComandoPase;
import futbol.tacticas.ComandoTiroAPuerta;
import futbol.tacticas.SituacionJugadores;
import futbol.tacticas.concursantes.Tactica;

import java.awt.Color;
import java.awt.Point;
import java.util.Vector;
import futbol.General;

/**
 *
 * @author alvaro ayerdi
 */

public class TacticaAFAM implements Tactica{
    int indice =0;
    
    private int nValores[][]={
        {-157,0,4},  // Jugador 1[0]
        {-113,-31,5},  // Jugador 2[1]
        {-113,31,5},  // Jugador 3[2]
        {-122,0,5},  // Jugador 4[3]
        {-71,-18,6},  // Jugador 5[4]
        {-71,18,6},  // Jugador 6[5]
        {-6,-50,6},  // Jugador 7[6]
        {0,63,6},  // Jugador 8[7]
        {107,0,7},  // Jugador 9[8]
        {105,65,7},  // Jugador 10[9]
        {107,-65,7}  // Jugador 11[10]
    };
    
    public Color getColor1() {
        return Color.BLUE;
    }
    
    public Color getColor2() {
        return Color.RED;
    }
    
    public Color getColorNumero() {
        return Color.black;
    }
    
    public String getNombre() {
        return "Los Leones-AFAM";
    }
    
    public int getXInicial(int n) {
        return nValores[n][0];
    }
    
    public int getYInicial(int n) {
        return nValores[n][1];
    }
    
    public int getFuerza(int n) {
        return nValores[n][2];
    }
    
    public Vector<Comando> getComandos(SituacionJugadores sj) {
        Point rivales[]=sj.getContrario();
        Point jugadores[]=sj.getMisJugadores();
        
        //System.out.println("acceso a metodo numero "+indice++);
        Vector<Comando> com=new Vector();
        //Posicionamiento
        for (int n=0;n<11;n++)
            com.add(new ComandoIrA(n,nValores[n][0],nValores[n][1]));
        
        //Movimiento mas cercano a la bola
        int nJug=sj.getMasCercanoDeBola();
        Point bola=sj.getBola();
        com.add(new ComandoIrA(nJug,bola.getX(), bola.getY()));
        
        //Movimiento portero
        movimientoPortero(com,bola);
        
        
        //Golpear bola
        com.add(new ComandoPase(0,4));//arquero tiene el balon
        
        
        //Movimiento defensas salen a marcar
        int jugadoresdanger[] = getjugadoresDanger(rivales);
        
        if ((nJug!=1) && bola.getX()<55) {
            double jcmasy =0;
            int marca =0;
            for(int njc=0; njc<3 ; njc++){
                if (rivales[njc].getY() <= jugadores[1].getY()){
                    jcmasy = rivales[njc].getY();
                    marca=njc;
                }
            }
            int nDis=(int)(General.getDistancia(jugadores[1].getX(),jugadores[1].getY(),rivales[marca].getX(),rivales[marca].getY()));
            if(nDis<75){
                com.add(new ComandoIrA(1, rivales[marca].getX()+10, rivales[marca].getY()));
            }else{
                //conserva su posicion
            }
        }
        
        if ((nJug!=2) && bola.getX()<55){
            double jcmasy =0;
            int marca =0;
            for(int njc=0; njc<3 ; njc++){
                if (rivales[njc].getY() >= jugadores[2].getY()){
                    jcmasy = rivales[njc].getY();
                    marca=njc;
                }
            }
            int nDis=(int)(General.getDistancia(jugadores[2].getX(),jugadores[2].getY(),rivales[marca].getX(),rivales[marca].getY()));
            if(nDis<75){
                com.add(new ComandoIrA(2, rivales[marca].getX(), rivales[marca].getY()));
            }else{
                //conserva su posicion
            }
            
        }
        
        if ((nJug!=3) && bola.getX()<55){
            double jcmasy =0;
            int marca =0;
            for(int njc=0; njc<3 ; njc++){
                if ( (rivales[njc].getY() < jugadores[2].getY()) && (rivales[njc].getY() > jugadores[1].getY())){
                    jcmasy = rivales[njc].getY();
                    marca=njc;
                }
            }
            int nDis=(int)(General.getDistancia(jugadores[3].getX(),jugadores[3].getY(),rivales[marca].getX(),rivales[marca].getY()));
            if(nDis<30){
                com.add(new ComandoIrA(3, rivales[marca].getX(), rivales[marca].getY()));
            }else{
                //conserva su posicion
            }
            
        }
        
        
        //Movimiento volantes de contencion en marca personal
        int x=0;
        if ((nJug!=4) && bola.getX()<20){
            int nJC=sj.getContrarioMasCerca(getXInicial(4), getYInicial(4));
            com.add(new ComandoIrA(4, rivales[nJC].getX(), rivales[nJC].getY()));
            x=nJC;
        }
        if ((nJug!=5) && bola.getX()<20){
            int nJC=sj.getContrarioMasCerca(getXInicial(5), getYInicial(5));
            if(x==nJC){
                com.add(new ComandoIrA(5, rivales[nJC].getX(), rivales[nJC].getY()+6));
                com.add(new ComandoIrA(4, rivales[nJC].getX(), rivales[nJC].getY()-6));
            }else{
                com.add(new ComandoIrA(5, rivales[nJC].getX(), rivales[nJC].getY()));
            }
        }
        // fin Movimiento volantes de contencion en marca personal
        
        
        //Defensa con el balon
        if(nJug>0 && nJug<4){
            if(nJug==1){
                int marca = sj.getContrarioMasCerca(1);
                //int nDis=(int)(General.getDistancia(jugadores[3].getX(),jugadores[3].getY(),rivales[marca].getX(),rivales[marca].getY()));
                //System.out.println("jugador mas cerca a mi y "+jugadores[1].getY()+", X:"+rivales[marca].getX()+", Y:"+rivales[marca].getY());
                if(jugadores[3].getY()>rivales[marca].getY())
                    com.add(new ComandoPase(1,4));
                else
                    com.add(new ComandoPase(1,6));
            }
            com.add(new ComandoPase(2,7));
            com.add(new ComandoPase(3,7));
        }
        
        //partida despues del gol
        if(nJug==10 && bola.getX()==0 && bola.getY()==0){
            com.add(new ComandoTiroAPuerta(10,0));
            
        }
        
        //movimiento del 8
        if ((nJug==7)){
            //int jugContrario = sj.getContrarioMasCerca(7);
           // if (General.getDistancia(xN, yN, ene[nJC].getX(), ene[nJC].getY())>30){
           //     comandos.add(new ComandoGolpearBola(nJug, xN, yN));
           //     bPuedeGolpear=false;
           // }
            //int mi jugcerca = sj.getMiJugadorMasCerca(jugadores[9].getX(),jugadores[9].getY());
            com.add(new ComandoGolpearBola(7, jugadores[9].getX()/5, jugadores[9].getY()/5));
            //System.out.println("Disparando a ("+jugadores[9].getX()/5+","+jugadores[9].getY()/5+")");
        }
        com.add(new ComandoPase(7,9));
        com.add(new ComandoPase(5,7));
        com.add(new ComandoPase(4,6));
        com.add(new ComandoPase(6,10));
        
        if ((nJug!=9) && bola.getX()<0){
            //com.add(new ComandoIrA(9,150,1));
        }
        
        com.add(new ComandoTiroAPuerta(8,0));
        com.add(new ComandoTiroAPuerta(9,0));
        com.add(new ComandoTiroAPuerta(10,0));
        return com;
    }
    
    private void movimientoPortero(Vector<Comando> com,Point bola){
        if(bola.getY()==0){
            com.add(new ComandoIrA(0,-150,0));
        }else{
            Double dx = bola.getX();
            Double dy = bola.getY();
            int m = 50;
            int numerador = dy.intValue() * (m+10);
            int denominador = m+160+dx.intValue();
            int nuevao = numerador/denominador;
            if(nuevao>30)
                com.add(new ComandoIrA(0,-150,31));
            else if(nuevao<-30)
                com.add(new ComandoIrA(0,-150,-31));
            else
                com.add(new ComandoIrA(0,-150,nuevao));
        }
    }
    
    private void movimientoDefensa(Vector<Comando> com,Point bola){
        if(bola.getY()==0){
            
        }else if(bola.getY()>0){
            Double dx = bola.getX();
            Double dy = bola.getY();
            int m = 1;
            int numerador = dy.intValue() * (m+10);
            int denominador = m+160+dx.intValue();
            int nuevao = numerador/denominador;
            com.add(new ComandoIrA(1,-113,nuevao));
        }else if(bola.getY()<0){
            Double dx = bola.getX();
            Double dy = bola.getY();
            int m = 1;
            int numerador = dy.intValue() * (m+10);
            int denominador = m+160+dx.intValue();
            int nuevao = numerador/denominador;
            com.add(new ComandoIrA(1,-113,nuevao));
        }
        
    }
    
    
    private int[] getjugadoresDanger(Point jugadorescontra[]){
        Point temp;
        int tempo;
        int players[]={0,1,2,3,4,5,6,7,8,9,10,11};
        for(int i=1; i<jugadorescontra.length; i++){
            for(int j=0;j<jugadorescontra.length-1; j++){
                if(jugadorescontra[j].getX()>jugadorescontra[j+1].getX()){
                    temp = jugadorescontra[j];
                    jugadorescontra[j] = jugadorescontra[j+1];
                    jugadorescontra[j+1] = temp;
                    tempo = players[j];
                    players[j] = players[j+1];
                    players[j+1]= tempo;
                }
            }
        }
        return players;
    }
    
    
}
